﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Collections;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositories;
using DAL;

namespace DAL.Repositories
{
  
        public class EjercicioRepository : IRepository<Ejercicio>
        {

            private List<IEntity> _insertItems;
            private List<IEntity> _updateItems;

            public EjercicioRepository()
            {
                _insertItems = new List<IEntity>();
                _updateItems = new List<IEntity>();
            }

            public void Insert(Ejercicio entity)
            {
                _insertItems.Add(entity);
            }

            public void Update(Ejercicio entity)
            {
                _updateItems.Add(entity);
            }

            public IEnumerable<Ejercicio> GetAll()
            {


                List<Ejercicio> listaEjercicios = null;

                SqlCommand cmd = new SqlCommand();
                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_listar_Ejercicios");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    listaEjercicios = new List<Ejercicio>();

                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        listaEjercicios.Add(new Ejercicio
                        {
                            Id = Convert.ToInt32(dr["id"]),
                            NombreComun = dr["nombre_comun"].ToString(),
                            NombreOpcional = dr["nombre_opcional"].ToString(),
                            Codigo = dr["codigo"].ToString(),
                            PosicionInicial = dr["posicion_inicial"].ToString(),
                            PosicionFinal = dr["posicion_final"].ToString(),
                            MusculoPrincipal = dr["musculo_principal"].ToString(),
                            ErroresComunes = dr["errores_comunes"].ToString(),
                            IndicacionesGenerales = dr["indicaciones_generales"].ToString()

                        });
                    }
                }

                return listaEjercicios;
            }

            public IEnumerable<Ejercicio> FiltrarListaEjercicios(String ptextoAfiltrar)
            {
                List<Ejercicio> listaEjercicios = null;

                SqlCommand cmd = new SqlCommand();

                cmd.Parameters.Add(new SqlParameter("@textoAfiltrar", ptextoAfiltrar));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_filtrar_Ejercicios");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    listaEjercicios = new List<Ejercicio>();

                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        listaEjercicios.Add(new Ejercicio
                        {
                            Id = Convert.ToInt32(dr["id"]),
                            NombreComun = dr["nombre_comun"].ToString(),
                            NombreOpcional = dr["nombre_opcional"].ToString(),
                            Codigo = dr["codigo"].ToString(),
                            PosicionInicial = dr["posicion_inicial"].ToString(),
                            PosicionFinal = dr["posicion_final"].ToString(),
                            MusculoPrincipal = dr["musculo_principal"].ToString(),
                            ErroresComunes = dr["errores_comunes"].ToString(),
                            IndicacionesGenerales = dr["indicaciones_generales"].ToString()

                        });
                    }
                }

                return listaEjercicios;
            }


            public Ejercicio GetById(int id)
            {
                Ejercicio objEjercicio = null;
                var sqlQuery = "SELECT id, nombre_comun, nombre_opcional,codigo,errores_comunes,indicaciones_generales FROM TbEjercicios WHERE id = @id";
                SqlCommand cmd = new SqlCommand(sqlQuery);
                cmd.Parameters.AddWithValue("@id", id);

                var ds = DBAccess.ExecuteQuery(cmd);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    var dr = ds.Tables[0].Rows[0];

                    objEjercicio = new Ejercicio
                    {
                        Id = Convert.ToInt32(dr["id"]),
                        NombreComun = dr["nombre_comun"].ToString(),
                        NombreOpcional = dr["nombre_opcional"].ToString(),
                        Codigo = dr["codigo"].ToString(),
                        ErroresComunes = dr["errores_comunes"].ToString(),
                        IndicacionesGenerales = dr["indicaciones_generales"].ToString()
                    };
                }



                return objEjercicio;
            }

            public void Save()
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    try
                    {
                        if (_insertItems.Count > 0)
                        {
                            foreach (Ejercicio objEjercicio in _insertItems)
                            {
                                InsertEjercicio(objEjercicio);
                            }
                        }

                        if (_updateItems.Count > 0)
                        {
                            foreach (Ejercicio p in _updateItems)
                            {
                                UpdateEjercicio(p);
                            }
                        }


                        scope.Complete();
                    }
                    catch (TransactionAbortedException ex)
                    {

                    }
                    catch (ApplicationException ex)
                    {

                    }
                    finally
                    {
                        Clear();
                    }

                }
            }

            public void Clear()
            {
                _insertItems.Clear();
                _updateItems.Clear();
            }

            private void InsertEjercicio(Ejercicio objEjercicio)
            {

                try
                {
                    int n = 0;
                    SqlCommand cmd1 = new SqlCommand();
                    SqlCommand cmd2 = new SqlCommand();

                    cmd1.Parameters.Add(new SqlParameter("@nombreComun", objEjercicio.NombreComun));
                    cmd1.Parameters.Add(new SqlParameter("@nombreOpcional", objEjercicio.NombreOpcional));
                    cmd1.Parameters.Add(new SqlParameter("@codigo", objEjercicio.Codigo));
                    cmd1.Parameters.Add(new SqlParameter("@imagenInicial", objEjercicio.PosicionInicial));
                    cmd1.Parameters.Add(new SqlParameter("@imagenFinal", objEjercicio.PosicionFinal));
                    cmd1.Parameters.Add(new SqlParameter("@musculoPrincipal", objEjercicio.MusculoPrincipal));
                    cmd1.Parameters.Add(new SqlParameter("@erroresComunes", objEjercicio.ErroresComunes));
                    cmd1.Parameters.Add(new SqlParameter("@indicacionesGenerales", objEjercicio.IndicacionesGenerales));


                    DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd1, "pa_agregar_ejercicio");

                    foreach (Musculo objMusculo in objEjercicio.ListaMusculos)
                    {
                        cmd2.Parameters.Add(new SqlParameter("@idMusculo", objMusculo.Id));
                        DataSet ds1 = DBAccess.ExecuteSPWithDS(ref cmd2, "pa_asociar_musculos");
                        cmd2.Parameters.Clear();
                    }



                }
                catch (Exception ex)
                {

                }

            }


            private void UpdateEjercicio(Ejercicio objEjercicio)
            {
                try
                {
                    SqlCommand cmd = new SqlCommand();

                    cmd.Parameters.Add(new SqlParameter("@nombre", objEjercicio.NombreComun));


                    DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_modificar_ejercicio");

                }
                catch (Exception ex)
                {

                }
            }



        }
    }
